package com.Ling.Thread.sync;

/**
 * File Name: DeadLock
 * Date: 2020-06-28 10:18
 * Author: liangling
 * Description
 */
public class DeadLock {

    public static void main(String[] args) {
        //多个线程彼此持有对方所需要的锁对象，而不释放自己的锁
        //wait:Object类中方法，当前线程释放自己的锁标记，并且让出CPU资源，使得当前的线程进入等待队列中。
        //notify:Object类终的方法，唤醒等待队列中的线程，使这个线程进入锁池
        //notifyAll:通知：Object类中的方法。唤醒等待队列中所有的线程，并使这些线程进入锁池。
        Runnable runnable = ()->{
            synchronized ("A"){
                System.out.println("A线程持有A锁，等到B锁");
                //释放已经持有的A锁标记，进入等待队列。
                try {
                    "A".wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized ("B"){
                    System.out.println("A线程同时持有A，B锁");
                }
            }
        };

        Runnable runnable1 = ()->{
            synchronized ("B"){
                System.out.println("B线程持有B锁，等待A锁");

                synchronized ("A"){
                    System.out.println("B线程持有A，B锁");
                    "A".notifyAll();
                }
            }
        };

        Thread thread = new Thread(runnable,"Thread -1");
        Thread thread1 = new Thread(runnable1,"THread-2");
        thread.start();
        thread1.start();
    }
}
